Sequencing jobs problem (advanced) emp JAMS GAMS short 0, loop((i,j)$(ord(i) < ord(j)), put emp / 'disjunction *' seq(i,j) 'else' seq(j,i)); putclose emp; putclose empopt / 'FileName convexhull.gms'; solve sequence_emp using emp min tardiness; abort$(sequence_emp.objval <> sequence.objval) 'EMP Convex Hull: Incorrect solution', sequence_emp.objval, sequence.objval; ); *--- EMP BigM put emp / 'default bigm' M:0:0; loop((i,j)$(ord(i) < ord(j)), put emp / 'disjunction *' seq(i,j) 'else' seq(j,i)); putclose emp; putclose empopt / 'FileName bigm.gms'; solve sequence_emp using emp min tardiness; abort$(sequence_emp.objval <> sequence.objval) 'EMP BigM: Incorrect solution', sequence_emp.objval, sequence.objval; *--- EMP Indicators (CPLEX, XPRESS and SCIP only) $if NOT SOLVER cplex $exit put emp / 'default indic'; loop((i,j)$(ord(i) < ord(j)), put emp / 'disjunction *' seq(i,j) 'else' seq(j,i)); putclose emp; putclose empopt / 'FileName indicators.gms' / 'SubSolver cplex'; solve sequence_emp using emp min tardiness; abort$(sequence_emp.objval <> sequence.objval) 'EMP Indicators: Incorrect solution', sequence_emp.objval, sequence.objval; *--- with EMP one can also mix & match different reformulation types *--- and change the parameters used by the reformulation put emp / 'default indic'; loop((i,j)$(ord(i) < ord(j) and ord(i) < card(i) and ord(j) < card(j)), put emp / 'disjunction *' seq(i,j) 'else' seq(j,i)); loop((i,j)$(ord(i) < ord(j) and (ord(i) < card(i)/2 and ord(j) = card(j))), put emp / 'disjunction bigm' M:0:0 '*' seq(i,j) 'else' seq(j,i)); loop((i,j)$(ord(i) < ord(j) and (ord(i) >= card(i)/2 and ord(j) = card(j))), put emp / 'disjunction chull 4000 *' seq(i,j) 'else' seq(j,i)); putclose emp; putclose empopt / 'FileName mixandmatch.gms' / 'SubSolver cplex'; solve sequence_emp using emp min tardiness; abort$(sequence_emp.objval <> sequence.objval) 'EMP Mix & Match: Incorrect solution', sequence_emp.objval, sequence.objval; ]]>